home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / nlist.c,OLD < prev    next >
Text File  |  1988-08-11  |  2KB  |  125 lines

  1. head     1.1;
  2. access   ;
  3. symbols  ;
  4. locks    ; strict;
  5. comment  @ * @;
  6.  
  7.  
  8. 1.1
  9. date     88.08.11.15.48.05;  author brent;  state Exp;
  10. branches ;
  11. next     ;
  12.  
  13.  
  14. desc
  15. @Name-list (string table) operations on binary files.
  16. @
  17.  
  18.  
  19.  
  20. 1.1
  21. log
  22. @Initial revision
  23. @
  24. text
  25. @/*
  26.  * Copyright (c) 1980 Regents of the University of California.
  27.  * All rights reserved.  The Berkeley software License Agreement
  28.  * specifies the terms and conditions for redistribution.
  29.  */
  30.  
  31. #if defined(LIBC_SCCS) && !defined(lint)
  32. static char sccsid[] = "@@(#)nlist.c    5.2 (Berkeley) 3/9/86";
  33. #endif LIBC_SCCS and not lint
  34.  
  35. #include <sys/types.h>
  36. #include <a.out.h>
  37. #include <stdio.h>
  38.  
  39. /*
  40.  * nlist - retreive attributes from name list (string table version)
  41.  */
  42. nlist(name, list)
  43.     char *name;
  44.     struct nlist *list;
  45. {
  46.     register struct nlist *p, *q;
  47.     register char *s1, *s2;
  48.     register n, m;
  49.     int maxlen, nreq;
  50.     FILE *f;
  51.     FILE *sf;
  52.     off_t sa;        /* symbol address */
  53.     off_t ss;        /* start of strings */
  54.     struct exec buf;
  55.     struct nlist space[BUFSIZ/sizeof (struct nlist)];
  56.  
  57.     maxlen = 0;
  58.     for (q = list, nreq = 0; q->n_un.n_name && q->n_un.n_name[0]; q++, nreq++) {
  59.         q->n_type = 0;
  60.         q->n_value = 0;
  61.         q->n_desc = 0;
  62.         q->n_other = 0;
  63.         n = strlen(q->n_un.n_name);
  64.         if (n > maxlen)
  65.             maxlen = n;
  66.     }
  67.     f = fopen(name, "r");
  68.     if (f == NULL)
  69.         return (-1);
  70.     fread((char *)&buf, sizeof buf, 1, f);
  71.     if (N_BADMAG(buf)) {
  72.         fclose(f);
  73.         return (-1);
  74.     }
  75.     sf = fopen(name, "r");
  76.     if (sf == NULL) {
  77.         /* ??? */
  78.         fclose(f);
  79.         return(-1);
  80.     }
  81.     sa = N_SYMOFF(buf);
  82.     ss = sa + buf.a_syms;
  83.     n = buf.a_syms;
  84.     fseek(f, sa, 0);
  85.     while (n) {
  86.         m = sizeof (space);
  87.         if (n < m)
  88.             m = n;
  89.         if (fread((char *)space, m, 1, f) != 1)
  90.             break;
  91.         n -= m;
  92.         for (q = space; (m -= sizeof(struct nlist)) >= 0; q++) {
  93.             char nambuf[BUFSIZ];
  94.  
  95.             if (q->n_un.n_strx == 0 || q->n_type & N_STAB)
  96.                 continue;
  97.             fseek(sf, ss+q->n_un.n_strx, 0);
  98.             fread(nambuf, maxlen+1, 1, sf);
  99.             for (p = list; p->n_un.n_name && p->n_un.n_name[0]; p++) {
  100.                 s1 = p->n_un.n_name;
  101.                 s2 = nambuf;
  102.                 while (*s1) {
  103.                     if (*s1++ != *s2++)
  104.                         goto cont;
  105.                 }
  106.                 if (*s2)
  107.                     goto cont;
  108.                 p->n_value = q->n_value;
  109.                 p->n_type = q->n_type;
  110.                 p->n_desc = q->n_desc;
  111.                 p->n_other = q->n_other;
  112.                 if (--nreq == 0)
  113.                     goto alldone;
  114.                 break;
  115.         cont:        ;
  116.             }
  117.         }
  118.     }
  119. alldone:
  120.     fclose(f);
  121.     fclose(sf);
  122.     return (nreq);
  123. }
  124. @
  125.